/**
 * @author: fuhuichao <763854696@qq.com> 
 * @version: 1.0.0
 * @address: https://git.oschina.net/Ahoi/cdtye-print-js.git
 * @createdate: 2017-5-26 09:10:08
 */
var cdtyeprint = {
	pageContentDom : '.wrapper-A4 .main-div',
	pageTemplateDom : '#template-print-page',
	pageNumberDom : 'printPageNum',
	debug : false,// 若要调试查看截取文字模板div时，设置为true
	fontSize : 14,
	lineHeight : 20,
	showBorder : true,// 是否显示div边框，默认为'border: 1px solid #000;'
	borderWidth : 1,
	borderStyle : 'solid',
	borderColor : '#000',
	paddingTop : 8,
	paddingRight : 5,
	paddingBottom : 8,
	paddingLeft : 5,
	verticalAlign : 'top',
	wordWrap : 'break-word',
	wordBreak : 'break-all',
	spanAlign : 'left',
	
	preprint : function(pageConfig){
		
		// 初始化
		this.init(pageConfig.init);

		var json = pageConfig.json;
		var keys = pageConfig.keys;
		var nopages = pageConfig.nopages;
		var others = pageConfig.others;
		
		// 标记循环是否继续
		var loopFlag = true;
		var pageCurNum = 0;
		while(loopFlag){
			pageCurNum ++;
			// 设置为false阻止下次循环，若有单元格截取文本后还剩余，则修改为true
			loopFlag = false;
			
			// 添加一页表格，并将需要分页处理的单元格的class加上当前页码
			$(this.pageContentDom).append($(this.pageTemplateDom).html().replace(this.pageNumberDom, this.pageNumberDom + pageCurNum));
			
			var that = this;
			// 处理分页文本
			$(keys).each(function(){
				loopFlag = that.deal(json, this.key, this.col, this.row, pageCurNum, loopFlag);
			});

			// 处理分页中特殊的表格td分页
			$(others).each(function(){
				// 添加作业组成员
				var field0 = this.fields[0];
				var field1 = this.fields[1];
				var thiskey = this.key;
				
				var arrays = json[thiskey];
				var arraysLength = arrays.length + 1;
				
				$(arrays).each(function(i, e){
					if(i < 30){
						// 第一页，工作组成员显示29个TD，最后一个TD显示总人数
						if(pageCurNum == 1 && i == 29){
							$('#'+that.pageNumberDom+pageCurNum).find('.'+thiskey+' td:eq('+(i+1)+')').text('共计： '+arraysLength+' 人');
						}else{
							$('#'+that.pageNumberDom+pageCurNum).find('.'+thiskey+' td:eq('+(i+1)+')').text(this[field0]+'('+this[field1]+')');
						}
					}
				});
				// 添加完成后去掉已添加的
				if(pageCurNum == 1){
					arrays.splice(0, 29);
				}else{
					arrays.splice(0, 30);
				}
				if(arrays.length > 0){
					loopFlag = true;
				}
			});
			
			
		}
		
		// 处理无需分页的文本
		$(nopages).each(function(){
			var nopagesKey = this.toString();
			$('.'+nopagesKey).text(json[nopagesKey]);
		});
		
	},
	 

	/* 
	 * 截取文本主要逻辑
	 * json： 需要截取的变量都存放在json里
	 * key：json中需要截取的变量的key值
	 * col：文本父级div的宽度，可传入固定像素值，也可为-1和不定义，代表获取父级div宽度像素
	 * row：文本可显示的行数值
	 * pageCurNum：当前分页页码
	 * loopFlag：本次截取后是否下次继续
	 * 
	 * return loopFlag 返回本次截取后是否下次继续
	 */
	deal:function(json, key, col, row, pageCurNum, loopFlag) {
		// 文本后缀，若截取后还剩余，则在当前页该文本后加'...'
		var suffix = ''; 
		
		// 存放文本的主要span
		var spanElement = $('#' + this.pageNumberDom + pageCurNum).find('.' + key);
		
		// 文本最大高度，文字n行占高initHeight+(lineHeight*(n-1))像素
		var parentHeight = this.initHeight + (this.lineHeight * (row - 1));
		// 固定td高度
		spanElement.parent().css('height', parentHeight + this.divPadding);

		// 文本宽度
		var parentWidth = null;
		if (col == undefined || col == -1) {
			parentWidth = spanElement.parent().width();
		} else {
			parentWidth = col;
		}
		
		// 该单元格对应变量总文本
		var all = json[key];
		// 该span对应变量截取后的剩余文本
		var remain = json[key + 'Remain'];
		// 该span对应变量当前截取下来要显示的文本
		var replace = '';
		// 如果是第一页，剩余文本未定义，则默认为总文本
		if (remain == undefined) {
			remain = all;
		}
		var remainLen = remain.length;

		// 获取当前宽度下的截取下标
		var cutIndex = this.getSubstringIndex(remain, parentWidth, parentHeight);

		// 若当次截取后还有剩余字符，则标记下次继续循环截取，并添加后缀
		if (cutIndex > 0 && cutIndex < remainLen) {
			// 减去两个字的位置，用来放省略号
			cutIndex -= 2;
			suffix = '...';
			loopFlag = true;
		}

		// 截取
		replace = remain.substring(0, cutIndex);
		remain = remain.substring(cutIndex, remainLen);

		// 将截取剩余的存入原json对象，下次循环截取时使用
		json[key + 'Remain'] = remain;

		// 显示文本到span标签
		spanElement.text(replace + suffix);
		
		return loopFlag;
	},
	
	// 返回分页需要截取的下标
	getSubstringIndex:function(text, width, height){
		// 文本总长度
		var len = text.length;	
		// 截取下标
		var index = len;		

		// 先将当前总长度取一半，若文本还多，则继续取一半，减少下个while循环次数
		while(index > 0 && this.getTextHeightByWidth(text.substring(0, index), width) > height){
			index = Math.floor(index/2);
		}

		// 若当前截取到的文本宽度超过TD宽度，则退出，并返回当前截取下标。
		while(index < len && this.getTextHeightByWidth(text.substring(0, index+1), width) <= height){
			index ++;
		}
		return index;
	},
	
	// 获取字符串实际长度像素
	getTextHeightByWidth:function(text, width){
		this.templateDiv.width(width);
		this.templateSpan.text(text);
		return this.templateSpan[0].offsetHeight;
	},
	
	generateElement : function(){
		$('#ahpprintTemplateDiv').remove();
		$('body').append('<div id="ahpprintTemplateDiv"><span></span></div>');
		
		this.templateDiv = $('#ahpprintTemplateDiv');
		this.templateSpan = $('#ahpprintTemplateDiv span');
		
		if(!this.debug){
			this.templateDiv.css({'visibility' : 'hidden'});
		}
		if(this.showBorder){
			this.templateDiv.css({
				'border-width' : this.borderWidth + 'px',
				'border-style' : this.borderStyle,
				'border-color' : this.borderColor
			});
		}else{
			this.borderWidth = 0;
		}
		this.templateDiv.css({
			'padding-top': this.paddingTop + 'px',
			'padding-right': this.paddingRight + 'px',
			'padding-bottom': this.paddingBottom + 'px',
			'padding-left': this.paddingLeft + 'px'
		});

		this.templateSpan.css({
			'margin': '0',
			'padding': '0',
			'border': '0',
			'font-size': this.fontSize + 'px',
			'line-height': this.lineHeight + 'px',
			'white-space': 'normal',
			'vertical-align': this.verticalAlign,
			'word-wrap': this.wordWrap,
			'word-break': this.wordBreak,
			'text-align':this.spanAlign
		});
		
		// 文字一行占高的像素值
		this.initHeight = this.getTextHeightByWidth('init', 100);
		// div高度
		this.divPadding = this.paddingTop + this.paddingBottom + this.borderWidth*2;
	},
	
	init : function(config){
		if(this.inited){return;}
		if(config.pageContentDom != undefined){this.pageContentDom = config.pageContentDom;}
		if(config.pageTemplateDom != undefined){this.pageTemplateDom = config.pageTemplateDom;}
		if(config.pageNumberDom != undefined){this.pageNumberDom = config.pageNumberDom;}
		if(config.debug != undefined){this.debug = config.debug;}
		if(config.fontSize != undefined){this.fontSize = config.fontSize;}
		if(config.lineHeight != undefined){this.lineHeight = config.lineHeight;}
		if(config.showBorder != undefined){this.showBorder = config.showBorder;}
		if(config.borderWidth != undefined){this.borderWidth = config.borderWidth;}
		if(config.borderStyle != undefined){this.borderStyle = config.borderStyle;}
		if(config.borderColor != undefined){this.borderColor = config.borderColor;}
		if(config.paddingTop != undefined){this.paddingTop = config.paddingTop;}
		if(config.paddingRight != undefined){this.paddingRight = config.paddingRight;}
		if(config.paddingBottom != undefined){this.paddingBottom = config.paddingBottom;}
		if(config.paddingLeft != undefined){this.paddingLeft = config.paddingLeft;}
		if(config.verticalAlign != undefined){this.verticalAlign = config.verticalAlign;}
		if(config.wordWrap != undefined){this.wordWrap = config.wordWrap;}
		if(config.wordBreak != undefined){this.wordBreak = config.wordBreak;}
		if(config.spanAlign != undefined){this.spanAlign = config.spanAlign;}

		this.generateElement();
		this.inited = true;
	},
	
	// 自定义打印制定内容
	startPrint : function(targetDom, excludeDom) {
		var $iframe = $("<iframe  />");
		$iframe.css({
			position : "absolute",
			width : "0px",
			height : "0px",
			left : "-600px",
			top : "-600px"
		});
		$iframe.appendTo("body");
		var doc = $iframe[0].contentWindow.document;
		$("link").each(
				function() {
					doc.write("<link type='text/css' rel='stylesheet' href='"
							+ $(this).attr("href") + "' />");
				});
		var $cloneHtml = $($('<div></div>').html($(targetDom).clone()));
		$cloneHtml.find(excludeDom).remove();
		doc.write($cloneHtml.html());
		doc.close();
		$iframe[0].contentWindow.focus();
		setTimeout(function() {
			$iframe[0].contentWindow.print();
		}, 1000);
	}
};

